/**
 * js导出execl
 */
import XLSX from 'xlsx'
/**
 * test
 * exportExecl () {
            const leageData = ['FPS']
            const xAliasData = [1, 3, 5, 7, 9]
            const seiesData = [19,29,27,12,134]
            const execlData = []
            const execlDataTile = ['时间', leageData[0]]
            execlData.push(execlDataTile)
            xAliasData.forEach((item, index) => {
                const itemArr = []
                itemArr.push(item, seiesData[index])
                execlData.push(itemArr)
            })
            exportExecl({execlData, exportName: 'Fps报表'})
        }
 */
/**
 * 导出execl
 * @param {Array} execlData - 二维数组
 */
export function exportExecl({ 
    execlData,
    exportName = '导出'
}) { 
    const sheet = XLSX.utils.aoa_to_sheet(execlData)
    openDownloadDialog(sheet2blob(sheet), exportName + '.xlsx')
}
/**
 * 通用的打开下载对话框方法，没有测试过具体兼容性
 * @param url 下载地址，也可以是一个blob对象，必选
 * @param saveName 保存文件名，可选
 */
function openDownloadDialog(url, saveName){
    if(typeof url == 'object' && url instanceof Blob){
        url = URL.createObjectURL(url); // 创建blob地址
    }
    const aLink = document.createElement('a');
    aLink.href = url;
    aLink.download = saveName || ''; // HTML5新增的属性，指定保存文件名，可以不要后缀，注意，file:///模式下不会生效
    let event;
    if (window.MouseEvent) { 
        event = new MouseEvent('click')
    } else {
        event = document.createEvent('MouseEvents');
        event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
    }
    aLink.dispatchEvent(event);
}

// 将一个sheet转成最终的excel文件的blob对象，然后利用URL.createObjectURL下载
function sheet2blob(sheet, sheetName) {
    sheetName = sheetName || 'sheet1';
    const workbook = {
        SheetNames: [sheetName],
        Sheets: {}
    };
    workbook.Sheets[sheetName] = sheet;
    // 生成excel的配置项
    const wopts = {
        bookType: 'xlsx', // 要生成的文件类型
        bookSST: false, // 是否生成Shared String Table，官方解释是，如果开启生成速度会下降，但在低版本IOS设备上有更好的兼容性
        type: 'binary'
    };
    const wbout = XLSX.write(workbook, wopts);
    const blob = new Blob([s2ab(wbout)], {type:"application/octet-stream"});
    // 字符串转ArrayBuffer
    function s2ab(s) {
        const buf = new ArrayBuffer(s.length);
        const view = new Uint8Array(buf);
        for (var i=0; i!=s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
        return buf;
    }
    return blob;
}
